"""
 encoding    : utf-8
 @File       : gong_si_lie_biao.py
 @Author     : jyy
 @Version    :
 @Description:只有正向验证方法类：tian_jia,bian_ji,shan_cu。验证方式为执行完成后再次获取页面信息核对，没有用数据库信息校验
 @Date       : 2024/07/11
"""


from selenium import webdriver
from selenium.webdriver.common.by import By
import pytest
from cloud_test.auto_code.pages.system_mangage import den_lu
from selenium.webdriver.common.keys import Keys
import time
import copy


def get_xia_la_kuang(driver):
    driver.implicitly_wait(5)                                       # 静态等待最多5秒
    try :
        web_yuan_su = driver.find_element(By.CSS_SELECTOR,'.ant-select-dropdown-menu')                      # 获取所属地区下拉框中的全部地区
        list_a = web_yuan_su.text.split('\n')                       # 获取地区可选项名称,储存为列表
        return list_a                                               # 获取所有地区选项,储存为列表
    except:
        raise pytest.fail(reason='公司列表-编辑弹窗-获取所有地区选项失败，Xpath定位不到ul下面的li元素')


def get_yuan_su(driver):                                            # 获取页面列表信息
    driver.implicitly_wait(5)                                       # 静态等待最多5秒
    try :
        web_yuan_su = driver.find_element(By.XPATH,
            '/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody')    # 获取页面列表中的全部公司信息
        list_a = web_yuan_su.text.split('\n')                       # 获取公司名称和编号,储存为列表
        return list_a
    except:
        raise pytest.fail(reason='公司列表-获取元素失败，Xpath定位不到tbody下面的tr元素')

def da_kai_lie_biao(driver):                                        # 进入公司列表页面
    try :
        driver.implicitly_wait(5)                                   # 静态等待最多5秒
        ele = driver.find_element(By.XPATH, '/html/body/div/section/aside/div/ul/li[4]/div/span')           # 定位系统管理菜单栏
        ele.click()                                                 # 点击系统管理菜单栏
        ele = driver.find_element(By.XPATH, '/html/body/div[1]/section/aside/div/ul/li[4]/ul/li[2]/a')      # 定位公司列表菜单栏
        ele.click()                                                 # 点击公司列表理菜单栏
    except :
        raise pytest.fail(reason='打开公司列表失败')

class gong_si():
    def tian_jia(self,driver,name):
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(self.driver)                                # 打开公司列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                 # 获取添加前的列表信息

        ele = driver.find_element(By.XPATH, '/html/body/div/section/section/main/div/div[1]/button[1]')     # 定位添加按钮
        ele.click()                                                 # 点击添加按钮

        ele = driver.find_element(By.XPATH, '//*[@id="cityId"]')    # 定位下拉框
        ele.click()                                                 # 点击下拉框
        ele = driver.find_element(By.XPATH, '/html/body/div[3]/div/div/div/ul/li[1]')   # 定位下拉框列表中第一个元素
        di_qu = ele.text                                            # 获取选择的地区的名称
        ele.click()                                                 # 点击第一个选项


        ele = driver.find_element(By.XPATH, '//*[@id="company"]')   # 定位输入框
        ele.click()                                                 # 点击输入框
        ele.send_keys(name)                                         # 输入添加的公司名称

        ele = driver.find_element(By.CSS_SELECTOR, 'html body div div div.ant-modal-wrap div.ant-modal div.ant-modal-content div.ant-modal-footer button.ant-btn')  # 定位弹窗的添加按钮
        ele.click()                                                 # 点击弹窗的添加按钮

        try :
            ele = driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div[2]/div[3]/button')     # 定位弹窗的添加按钮
            raise pytest.fail(reason=f'已经添加过该公司')
        except :
            list_b = get_yuan_su(driver)                            # 获取添加后的列表信息
            if list_a == list_b :                                   # 对比两次的读取结果
                raise pytest.fail(reason=f'公司列表-添加失败\n添加前读取的公司列表信息:{list_a}\n添加后读取的公司列表信息:{list_b}')
            else :
                list_b.reverse()                                    # 翻转添加后的列表顺序
                b = list_b[0].split(' ')                            # 获取list_b的第一个元素。将编号和城市名称按空格拆分加入列表b
                if name == b[1] and di_qu == b [2]:                 # 对比添加的名称与读取到的列表中的新名称是否相等
                    assert 1 == 1 ,'公司名称添加成功'
                else :
                    raise pytest.fail(reason=f'公司列表-添加失败，新名称与添加的名称不同\n添加前读取的公司列表信息:{list_a}\n添加后读取的公司列表信息:{list_b}')

    def bian_ji(self,driver,name,nwe,di_qu):                        # 传入浏览器实例，要编辑的公司名称，名称修改为nwe传入值，地区修改为di_qu传入值
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(driver)                                     # 打开公司列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                 # 获取编辑前的列表信息

        int_a = 1                                                   # 变化选择的是第几个勾选框，从1开始
        int_b = 0                                                   # 记录找到的信息在第几行，没改变就是没找到
        int_c = 1                                                   # 定位地区选项用
        for i in list_a:
            if i.split(' ')[1] == name:
                ele = driver.find_element(By.XPATH,
                                          f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[{int_a}]/td[1]/span/label/span/input')
                # 定位要修改的城市的勾选框
                ele.click()                                         # 点击勾选框
                int_b = int_a - 1
                break
            int_a += 1
        if int_b == 0:
            raise pytest.fail(reason=f'公司列表-编辑失败，找不到：为{name}的公司名称\n编辑前读取的公司列表信息:{list_a}')

        ele = driver.find_element(By.XPATH, '/html/body/div[1]/section/section/main/div/div[1]/button[2]')  # 定位编辑按钮
        ele.click()  # 点击编辑按钮

        ele = driver.find_element(By.XPATH, '//*[@id="cityId"]')    # 定位下拉框
        ele.click()  # 点击下拉框

        list_c = get_xia_la_kuang(driver)                           # 获取所属地区下拉框中的可选项

        for i in list_c :
            if i == di_qu :
                ele = driver.find_element(By.XPATH, f'/html/body/div[3]/div/div/div/ul/li[{int_c}]')          # 定位下拉框列表中与di_qu同名的元素
                ele.click()                                         # 点击选项
                break
            int_c += 1
        if int_c > len(list_c) :
            raise pytest.fail(reason=f'所属地区中没有名为：{di_qu}的地区\n可选地区为:{list_c}')


        ele = driver.find_element(By.XPATH, '//*[@id="company"]')   # 定位输入框
        ele.click()                                                 # 点击输入框
        ele.send_keys(Keys.CONTROL, 'a')                            # 全选文本
        ele.send_keys(Keys.BACK_SPACE)                              # 删除原来的文本
        ele.send_keys(nwe)                                          # 输入要修改的城市名称

        ele = driver.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div/div[2]/div[3]/button')          # 定位弹窗的编辑按钮
        ele.click()                                                 # 点击弹窗的编辑按钮

        list_b = get_yuan_su(driver)                                # 获取编辑后的列表信息

        if list_b[int_b].split(' ')[1] == nwe and list_b[int_b].split(' ')[2] == di_qu :
            assert 1 == 1 , '编辑成功'
        else :
            raise pytest.fail(reason=f'编辑失败，选择编辑的公司名：{name}修改为：{nwe}\n地区修改为：{di_qu}'
                                     f'\n编辑前的公司列表信息：{list_a}'
                                     f'\n编辑后的公司列表信息：{list_b}')

    def shan_chu(self,driver,name=' '):
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(self.driver)                                # 打开公司列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                 # 获取删除前的列表信息
        if list_a == [''] :
            raise pytest.fail(reason=f'没有可删除的公司信息，获取到的页面信息为：{list_a}')

        int_a = 1
        int_b = 0
        if name == ' ':                                             # 未指定删除的城市名称，默认删除第1行
            ele = driver.find_element(By.XPATH,
                                      f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[1]/span/label/span/input')
            # 默认定位第一行的公司的勾选框
            ele.click()                                             # 点击勾选框
        if name != ' ':
            for i in list_a:
                if i.split(' ')[1] == name:
                    ele = driver.find_element(By.XPATH,
                                        f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[{int_a}]/td[1]/span/label/span/input')
                    # 定位要修改的公司的勾选框
                    ele.click()                                     # 点击勾选框
                    int_b = int_a - 1
                    break
                int_a += 1
            if int_b == 0 :
                raise pytest.fail(reasom=f'删除失败，没有找到名为：{name}的公司名' )
        ele = driver.find_element(By.XPATH, '/html/body/div[1]/section/section/main/div/div[1]/button[3]')  # 定位删除按钮
        ele.click()                                                 # 点击删除

        ele = driver.find_element(By.CSS_SELECTOR, 'button.ant-btn-danger:nth-child(2)')     #定位删除的二次确认弹窗的确定按钮
        ele.click()                                                 # 点击确定

        list_b = get_yuan_su(driver)                                # 获取删除后的公司列表信息
        if name != ' ':                                             # 如果指定了删除的公司名
            try :
                if list_b[int_b].split(' ')[1] == name:             # 删除后的列表中，被删除的那一行的公司名称与指定删除的公司名称相同
                    raise pytest.xfail(reason=f'删除失败，删除的公司名称：{name}\n删除后的公司列表信息：{list_b}')
                elif list_b[int_b].split(' ')[1] != name:
                    assert 1 == 1, '删除成功'
            except :
                assert 1 == 1, '删除成功'
        elif name == ' ':                                           # 如果未指定删除的公司名
            try :
                if list_a[int_b].split(' ')[1] == list_b[int_b].split(' ')[1]:          # 删除前的第1行的公司名与删除后的第1行的公司名相同
                    raise pytest.xfail(
                        reason=f'删除失败，删除的公司名称：{list_a[int_b].split(' ')[1]}\n删除后的公司列表信息：{list_b}')
            except :
                assert 1 == 1, '删除成功'


"""
调试用
driver = webdriver.Firefox()        # 创建火候浏览器实例
url = 'http://127.0.0.1:82/cloud/#/open/login'
a=den_lu.deng_lu()
a.da_kai_llq(driver,url)
a.deng_lu(driver,'admin','123456','8888')
b = gong_si()
b.shan_chu(driver,'呜呜呜')
"""

